package main

import "time"

type Base struct {
	Id   int
	Name string
}

// 微博内容
// 评论内容信息
type PostContent struct {
	Id          int       // 编号
	Content     string    // 内容
	CommentTime time.Time // 时间
	Type        int       // 类型
	PostMan     string    // 发布人
	To          string    // 给谁发布的（博主姓名）
}

//博主类
type Blogger struct {
	Base
	WeiBos []*PostContent
	// 评论内容，一定要区分属于哪个微博的，所以在这使用了map ,map的key表示的是微博的编号
	//  value 表示具体的评论内容
	Comments map[int][]*PostContent
	Fans     []FansInterfacer // 存储粉丝数据，实际上存储的就是粉丝对象（友好的和不友好），让友好的粉丝类实现接口，让不友好粉丝类实现接口
	// 那么友好粉丝类和不友好粉丝类创建出的对象可以赋值给接口变量。

}

// 定义一个函数，完成博主类对象的创建
func NewBlogger(name string) *Blogger {
	blg := new(Blogger)
	blg.Name = name
	blg.Comments = map[int][]*PostContent{}
	blg.WeiBos = make([]*PostContent, 0)
	return blg
}

// 发布微博的方法的实现
// 第一个参数：表示微博的内容，第二个参数表示的是微博的类型
func (b *Blogger) PostWeiBo(content string, wbType int) {
	weibo := new(PostContent)
	weibo.Id = b.GetId()
	weibo.Content = content
	weibo.Type = wbType
	weibo.PostMan = b.Name
	weibo.To = "All"
	b.WeiBos = append(b.WeiBos, weibo)

}

// 获取微博的编号
func (b *Blogger) GetId() int {
	// 获取切片中存储的最后一条微博数据的ID值，然后让该值加1，作为新发布的微博的编号。
	if len(b.WeiBos) == 0 {
		return 0
	} else {
		return b.WeiBos[len(b.WeiBos)-1].Id + 1
	}
}

type BloggerInterfacer interface {
	//粉丝可以关注博主
	Attach(bFans FansInterfacer)
	//粉丝可以取消对博主的关注
	Detach(bFans FansInterfacer)
	//微博发布后，可以通知粉丝
	Notify(wbid int)
}

func (b *Blogger) Notify(wbid int) {
	// 1: 对切片进行遍历，获取每个粉丝数据
	for _, fan := range b.Fans {
		fan.Update(b, wbid)
	}
	// 2: 发送通知
}

// 粉丝关注博主
func (b *Blogger) Attach(bFans FansInterfacer) {
	b.Fans = append(b.Fans, bFans)
}

// 粉丝取消对博主的关注
func (b *Blogger) Detach(bFans FansInterfacer) {
	// 1: 将要移除的粉丝数据传递过来，然后在切片中查询
	for i := 0; i < len(b.Fans); i++ {
		if b.Fans[i] == bFans {
			b.Fans = append(b.Fans[:i], b.Fans[i+1:]...)
		}
	}
	// 2: 从切片中移除粉丝数据
}

type FansInterfacer interface {
	// 接收博主发出的通知
	Update(blogger BloggerInterfacer, wbid int)
	// 具体操作的方法，例如：发布评论
	Action(blogger BloggerInterfacer, wbid int)
}
